package com.hucsmn.charstats;

import java.util.Scanner;

/**
 * 作业题一：
 * 编程统计字符串"ABCD123!@#$%ab"中大写字母、小写字母、数字、其它字符的个数并打印出来。
 */
public class CharStats {
    public static void main(String[] args) {
        System.out.println("\"ABCD123!@#$%ab\" 的统计结果：");
        System.out.println(Stats.count("ABCD123!@#$%ab"));

        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.print("待统计字符串：");
            String text = sc.nextLine().trim();
            System.out.println("其中：");
            Stats stats = Stats.count(text);
            System.out.println(stats);
        }
    }

    /**
     * 字符统计数据类。
     */
    public static class Stats {
        private final int upper;
        private final int lower;
        private final int digit;
        private final int other;

        private Stats(int upper, int lower, int digit, int other) {
            this.upper = upper;
            this.lower = lower;
            this.digit = digit;
            this.other = other;
        }

        /**
         * 统计字符串中各类字符的出现次数。
         *
         * @param text 需要统计的 UTF-16 字符串。
         * @return 输入字符串的字符统计数据。
         */
        public static Stats count(String text) {
            int upper = 0;
            int lower = 0;
            int digit = 0;
            int other = 0;
            for (int i = 0, w = 0; i < text.length(); i += w) {
                int cp = text.codePointAt(i);
                w = cp > Character.MAX_VALUE ? 2 : 1;

                if (Character.isUpperCase(cp)) {
                    upper += 1;
                } else if (Character.isLowerCase(cp)) {
                    lower += 1;
                } else if (Character.isDigit(cp)) {
                    digit += 1;
                } else {
                    other += 1;
                }
            }
            return new Stats(upper, lower, digit, other);
        }

        @Override
        public String toString() {
            final StringBuilder sb = new StringBuilder();
            final String newline = System.lineSeparator();
            sb.append("大写字母个数：").append(upper).append(newline);
            sb.append("小写字母个数：").append(lower).append(newline);
            sb.append("　　数字个数：").append(digit).append(newline);
            sb.append("其它字符个数：").append(other).append(newline);
            return sb.toString();
        }
    }
}
